package com.ms.service.inter;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ms.entity.Event;
import com.ms.entity.Registration;
import com.ms.entity.User;
import java.util.List;
import java.util.Map;

/**
 * 比赛服务接口 - 定义比赛相关的业务逻辑
 */
public interface EventService extends IService<Event> {

    /**
     * 根据比赛ID查找比赛
     *
     * @param eventID 比赛ID
     * @return 比赛对象
     */
    Event findById(String eventID);

    /**
     * 获取所有比赛
     *
     * @return 比赛列表
     */
    List<Event> findAll();

    /**
     * 根据类别获取比赛
     *
     * @param category 比赛类别
     * @return 比赛列表
     */
    List<Event> findByCategory(String category);

    /**
     * 根据比赛ID获取所有项目
     *
     * @param gameID 比赛ID
     * @return 项目列表
     */
    List<Event> findByGameId(String gameID);

    /**
     * 保存比赛项目
     *
     * @param event 比赛项目对象
     * @return 是否保存成功
     */
    boolean saveEvent(Event event);

    /**
     * 检查用户是否已报名某比赛
     *
     * @param userID  用户ID
     * @param eventID 比赛ID
     * @return 是否已报名
     */
    boolean isUserRegistered(String userID, String eventID);

    /**
     * 用户报名比赛
     *
     * @param userID  用户ID
     * @param eventID 比赛ID
     * @return 报名结果
     */
    boolean registerUserForEvent(String userID, String eventID);

    /**
     * 用户取消报名
     *
     * @param userID  用户ID
     * @param eventID 比赛ID
     * @return 取消结果
     */
    boolean cancelRegistration(String userID, String eventID);

    /**
     * 获取用户报名的所有比赛
     *
     * @param userID 用户ID
     * @return 比赛列表
     */
    List<Event> findEventsByUserId(String userID);

    /**
     * 删除比赛项目
     *
     * @param eventID 比赛项目ID
     * @return 是否删除成功
     */
    boolean deleteEvent(Integer eventID);
    
    /**
     * 根据比赛项目ID获取所有报名信息及用户信息
     * @param eventID 比赛项目ID
     * @return 报名信息列表，包含用户详细信息
     */
    List<Map<String, Object>> getRegistrationsWithUserInfo(String eventID);

    /**
     * 根据主办方ID获取所有比赛及其项目信息
     * @param organizerId 主办方ID
     * @return 比赛及项目信息列表
     */
    List<Map<String, Object>> getGamesAndEventsByOrganizerId(Integer organizerId);
}